import { IsString, IsOptional, MinLength, MaxLength, IsNumber, IsBoolean, IsEnum } from 'class-validator';
import mongoose from 'mongoose';

export class CreateMenuDto {
  @IsString({ message: '菜单路径必须是字符串' })
  @MinLength(2, { message: '菜单路径长度不能小于2个字符' })
  @MaxLength(100)
  path!: string;
  //菜单类型
  @IsEnum(['contents', 'page'])
  @IsString({ message: '菜单类型必须是字符串' })
  @MinLength(2, { message: '菜单类型长度不能小于2个字符' })
  @MaxLength(100)
  type!: 'contents' | 'page';
  @IsString({ message: '菜单标题必须是字符串' })
  @MinLength(2, { message: '菜单标题长度不能小于2个字符' })
  @MaxLength(50)
  title!: string;
  @IsNumber({}, { message: '排序字段必须是数字' })
  sort!: number;
  @IsBoolean({ message: '激活状态字段必须是布尔值' })
  isActive!: boolean;
  @IsOptional()
  parentId!: mongoose.Schema.Types.ObjectId | null;
  @IsOptional()
  @IsString({ message: '重定向路径必须是字符串' })
  @MinLength(2, { message: '重定向路径长度不能小于2个字符' })
  @MaxLength(100)
  redirect?: string;
  @IsOptional()
  @IsBoolean({ message: '面包屑字段必须是布尔值' })
  breadcrumb?: boolean;
  @IsOptional()
  @IsBoolean({ message: '不缓存字段必须是布尔值' })
  noCache?: boolean;
  @IsOptional()
  @IsBoolean({ message: '固定字段必须是布尔值' })
  affix?: boolean;
  @IsOptional()
  @IsString({ message: '链接路径必须是字符串' })
  @MinLength(2, { message: '链接路径长度不能小于2个字符' })
  @MaxLength(100)
  linkSrc?: string;
  @IsOptional()
  @IsBoolean({ message: '新窗口字段必须是布尔值' })
  newWindow?: boolean;
  @IsOptional()
  @IsString({ message: '图标字段必须是字符串' })
  @MinLength(2, { message: '图标字段长度不能小于2个字符' })
  @MaxLength(50)
  icon?: string;
  @IsBoolean({ message: '隐藏字段必须是布尔值' })
  hidden!: boolean;
  @IsOptional()
  @IsString({ message: '租户ID必须是字符串' })
  @MinLength(2, { message: '租户ID长度不能小于2个字符' })
  @MaxLength(50)
  tenantId?: mongoose.Schema.Types.ObjectId;
  @IsOptional()
  meta?: Record<string, any>;
  @IsOptional()
  @IsString({ message: '创建人必须是字符串' })
  createdBy!: mongoose.Schema.Types.ObjectId;

}
export class UpdateMenuDto {
  @IsString({ message: '菜单路径必须是字符串' })
  @MinLength(2, { message: '菜单路径长度不能小于2个字符' })
  @MaxLength(100)
  path!: string;
  @IsString({ message: '组件路径必须是字符串' })
  @MinLength(2, { message: '组件路径长度不能小于2个字符' })
  @MaxLength(100)
  component!: string;
  @IsString({ message: '菜单标题必须是字符串' })
  @MinLength(2, { message: '菜单标题长度不能小于2个字符' })
  @MaxLength(50)
  title!: string;
  @IsNumber({}, { message: '排序字段必须是数字' })
  sort!: number;
  @IsBoolean({ message: '激活状态字段必须是布尔值' })
  isActive!: boolean;
  @IsOptional()
  parentId!: mongoose.Schema.Types.ObjectId | null;
  @IsOptional()
  @IsString({ message: '重定向路径必须是字符串' })
  @MinLength(2, { message: '重定向路径长度不能小于2个字符' })
  @MaxLength(100)
  redirect?: string;
  @IsOptional()
  @IsBoolean({ message: '总是显示字段必须是布尔值' })
  breadcrumb?: boolean;
  @IsOptional()
  @IsBoolean({ message: '不缓存字段必须是布尔值' })
  noCache?: boolean;
  @IsOptional()
  @IsBoolean({ message: '固定字段必须是布尔值' })
  affix?: boolean;
  @IsOptional()
  @IsString({ message: '链接路径必须是字符串' })
  @MinLength(2, { message: '链接路径长度不能小于2个字符' })
  @MaxLength(100)
  linkSrc?: string;
  @IsOptional()
  @IsBoolean({ message: '新窗口字段必须是布尔值' })
  newWindow?: boolean;
  @IsOptional()
  @IsString({ message: '图标字段必须是字符串' })
  @MinLength(2, { message: '图标字段长度不能小于2个字符' })
  @MaxLength(50)
  icon?: string;
  @IsBoolean({ message: '隐藏字段必须是布尔值' })
  hidden!: boolean;
  @IsOptional()
  @IsString({ message: '租户ID必须是字符串' })
  @MinLength(2, { message: '租户ID长度不能小于2个字符' })
  @MaxLength(50)
  tenantId?: mongoose.Schema.Types.ObjectId;
  @IsOptional()
  meta?: Record<string, any>;
  @IsOptional()
  @IsString({ message: '更新人必须是字符串' })
  updatedBy!: mongoose.Schema.Types.ObjectId;
}